/**
 * 
 */
package model.facade.persistence.mysql;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.core.torneo.Gara;
import model.core.utente.Giocatore;
import model.core.utente.Squadra;
import model.facade.persistence.SquadraDAO;

/**
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class SquadraDAO_MySQL extends MySQLDomainDAO implements SquadraDAO{
	
	/**
	 * @param dbms
	 * @throws SQLException 
	 */
	public SquadraDAO_MySQL(MySQLDBMS dbms) throws SQLException {
		super(dbms);
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#insert(java.lang.Object)
	 */
	@Override
	public boolean insert(Object obj) {
		// TODO Auto-generated method stub
		if(obj instanceof Squadra){
			try {
				synchronized (obj) {
					Squadra s = (Squadra)obj;
					int pres = MySQLUtentiQueryUtility.getIdStudente(s.getPresidente().getMatricola(), s.getPresidente().getPassword(), mys);
					int c = MySQLUtentiQueryUtility.getIdStudente(s.getCapitano().getMatricola(), s.getCapitano().getPassword(), mys);
					int cap = MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(c, mys);
					PreparedStatement r = mys.getPreparedStatement("insert into giocatore(partite_giocate,partite_vinte,partite_perse,totale_punti, tipo,capitano,presidente,recapito,nome) values(?,?,?,?,?,?,?,?,?)");
					r.setInt(1, s.getPartite_giocate());
					r.setInt(2, s.getPartite_vinte());
					r.setInt(3, s.getPartite_perse());
					r.setInt(4, s.getTotale_punti());
					r.setString(5, "SQUADRA");
					if(cap!=-1)r.setInt(6, cap);
					else r.setNull(6, java.sql.Types.NULL);
					if(pres!=-1)r.setInt(7, pres);
					else r.setNull(7, java.sql.Types.NULL);
					r.setString(8, s.getPresidente().getRecapito());
					r.setString(9, s.getNome());
					r.execute();
					r.close();
					int sq = MySQLUtentiQueryUtility.getIdSquadraByNome(s.getNome(), mys);
					if(sq!=-1){
						for(Giocatore g: s.getPartecipanti()){
							int gid = MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(g, mys);
							if(gid==-1)
								return false;
						}
						for(Giocatore g: s.getPartecipanti()){
							int gid = MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(g, mys);
							mys.executeUpdate("insert into componenti_squadra(idsquadra,idgiocatore) values("+sq+","+gid+")");
						}
						return true;
					}
					else
						return false;	
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				return false;
			}
		}else
			return false;
	}

	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#delete(java.lang.Object)
	 */
	@Override
	public boolean delete(Object obj) {
		if(obj instanceof Gara){
			Squadra g = (Squadra)obj;
			try {
				mys.executeUpdate("delete from giocatore where nome=\""+g.getNome()+"\"");
				return true;
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return false;
			}
		}else return false;
	}

	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#update(java.lang.Object)
	 */
	@Override
	public boolean update(Object obj) {
		// TODO Auto-generated method stub
		if(obj instanceof Squadra){
			try {
				synchronized (obj) {
					Squadra s = (Squadra)obj;
					int pres = MySQLUtentiQueryUtility.getIdStudente(s.getPresidente().getMatricola(), s.getPresidente().getPassword(), mys);
					int c = MySQLUtentiQueryUtility.getIdStudente(s.getCapitano().getMatricola(), s.getCapitano().getPassword(), mys);
					int cap = MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(c, mys);
					ResultSet r = mys.getResult("select * from giocatore where nome=\""+s.getNome()+"\"");
					if(r.first()){
						r.updateInt("partite_giocate", s.getPartite_giocate());
						r.updateInt("partite_vinte", s.getPartite_vinte());
						r.updateInt("partite_perse", s.getPartite_perse());
						r.updateInt("totale_punti", s.getTotale_punti());
						if(cap!=-1)r.updateInt("capitano", cap);
						if(pres!=-1)r.updateInt("presidente", pres);
						r.updateString("recapito", s.getPresidente().getRecapito());
						r.updateString("nome", s.getNome());
						r.updateRow();
						r.close();
						return true;
					}
					else
						return false;	
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				return false;
			}
		}else
			return false;
	}

	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#retrieve(java.lang.Object[])
	 */
	@Override
	public Object retrieve(Object... properties) {
		// TODO Auto-generated method stub
		if(properties!=null && properties.length==1){
			Object o1=properties[0];
			if(o1 instanceof String){
				return MySQLUtentiQueryUtility.getSquadraByNome((String)o1, mys);
			}
			else
				return null;
		}else
			return null;
	}

	public void eliminaGiocatoreFromSquadra(Giocatore giocatore, Squadra squadra) throws SQLException{
		mys.executeUpdate("delete from componenti_squadra where idsquadra="+MySQLUtentiQueryUtility.getIdSquadraByNome(squadra.getNome(), mys)+" and idgiocatore="+MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(giocatore, mys));
	}
	
	public void addGiocatoreToSquadra(Giocatore giocatore, Squadra squadra, MySQLDBMS mys) throws SQLException{
		mys.executeUpdate("insert into componenti_squadra (idsquadra,idgiocatore) values("+MySQLUtentiQueryUtility.getIdSquadraByNome(squadra.getNome(), mys)+","+MySQLUtentiQueryUtility.getIdGiocatorebyIdStudente(giocatore, mys)+")");
	}
	
	public List<? extends Squadra> load(String text) throws SQLException{
		List<Squadra> list = new ArrayList<Squadra>();
		ResultSet r = mys.getResult("select * from giocatore where tipo like\"%SQUADRA%\" and (nome like\"%"+text+"%\" or partite_giocate like\"%"+text+"%\" or " +
				"partite_vinte like\"%"+text+"%\" or partite_perse like\"%"+text+"%\" or totale_punti like\"%"+text+"%\")");
		while(r.next()){
			list.add((Squadra)retrieve(r.getString("nome")));
		}
		r.close();
		return list;
	}
	
}
